package pl.gettoknowme.mobile.android.services.sms;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import pl.gettoknowme.mobile.android.services.sms.SmsMessage.MessageType;
import pl.gettoknowme.mobile.android.util.LoggingUtil;

/**
 * Analizator SMS-ów pod kątem płci
 * @author Michał Kołodziejski
 */
public class SmsSexAnalyzer {

    public static final String[] MALE_KEYWORDS = {
        "szedlem",
        "szedłem",
        "bylem",
        "byłem",
        "ąłem",
        "alem"
    };

    public static final String[] FEMALE_KEYWORDS = {
        "szlam",
        "szłam",
        "bylam",
        "byłam",
        "ęłam",
        "elam"
    };
    
    public static final String[][] KEYWORDS_ARRAY = {
        MALE_KEYWORDS,
        FEMALE_KEYWORDS
    };
    
    
    /**
     * Analizuje listę SMS-ów pod względem płci nadawcy.
     * Zwraca prawdopodobieństwo tego, że nadawcą jest mężczyzna lub liczbę ujemną, jeżeli ustalenie płci
     * nie było możliwe
     * 
     * @param smsMessageList lista SMS-ów do przeanalizowania
     * @return prawdopodobieństwo tego, że nadawcą jest mężczyzna albo -1 jeżeli ustalenie nie było możliwe
     */
    public float analyze(List<SmsMessage> smsMessageList){
        Map<String, Integer> wordOccurencesMap = new HashMap<String, Integer>();
        
        for(SmsMessage smsMessage : smsMessageList){
            if(MessageType.MESSAGE_TYPE_SENT.equals(smsMessage.getMessageType())){
                // analizujemy tylko wychodzące SMS-y
                wordOccurencesMap = analyzeSmsMessage(smsMessage, wordOccurencesMap);
            }
        }

        int maleKeywordsOccurences = 0;
        int femaleKeywordsOccurences = 0;
        
        for(String maleKeyword : MALE_KEYWORDS){
            if(wordOccurencesMap.containsKey(maleKeyword)){
                LoggingUtil.d(this, "word: "+maleKeyword+", occurences: "+wordOccurencesMap.get(maleKeyword).intValue());
                maleKeywordsOccurences += wordOccurencesMap.get(maleKeyword).intValue();
            }
        }

        for(String femaleKeyword : FEMALE_KEYWORDS){
            if(wordOccurencesMap.containsKey(femaleKeyword)){
                LoggingUtil.d(this, "word: "+femaleKeyword+", occurences: "+wordOccurencesMap.get(femaleKeyword).intValue());
                femaleKeywordsOccurences += wordOccurencesMap.get(femaleKeyword).intValue();
            }
        }

        LoggingUtil.d(this, "male words occurences: "+maleKeywordsOccurences);
        LoggingUtil.d(this, "female words occurences: "+femaleKeywordsOccurences);
        
        float maleProbability = 0.0f;
        if(maleKeywordsOccurences > 0 || femaleKeywordsOccurences > 0){
            // wylicznie prawdopodobienstwa, ze mezczyzna
            maleProbability = (maleKeywordsOccurences / (maleKeywordsOccurences + femaleKeywordsOccurences));
            
        } else {
            // wartość ujemna - oznacza, że nie można było wyznaczyć
            maleProbability = -1.0f;
        }
        
        LoggingUtil.d(this, "maleProbability: "+maleProbability);
        return maleProbability;
    }

    /**
     * Analizuje dane wiadomości SMS pod kątem występowania słów kluczowych
     * @param smsMessage wiadomość SMS
     * @param initialMap inicjalna mapa
     * @return mapa (słowo -> ilość wystąpień)
     */
    protected Map<String, Integer> analyzeSmsMessage(SmsMessage smsMessage,
            Map<String, Integer> initialMap){
        String lowercaseSmsBody = smsMessage.getBody().toLowerCase();
        
        int startIdx;
        int occurences;
        for(String[] keywordsArray : KEYWORDS_ARRAY){
            for(String keyword : keywordsArray){
                boolean start = true;
                startIdx = 0;
                occurences = 0;
                while (startIdx != -1){
                    if(!start){
                        startIdx += keyword.length();
                    }
                    start = false;
                    startIdx = lowercaseSmsBody.indexOf(keyword, startIdx);
                    if(startIdx != -1){
//                        LoggingUtil.d(this, "word: "+lowercaseSmsBody.substring(((startIdx >= 10) ? startIdx-10 : 0), startIdx));
                        ++occurences;
                    }
                };
                
                if(occurences != 0){
                    Integer savedOcc = initialMap.get(keyword);
                    if(savedOcc == null){
                        initialMap.put(keyword, Integer.valueOf(occurences));
                    } else {
                        initialMap.put(keyword, Integer.valueOf(savedOcc.intValue() + occurences));
                    }
                }
            }
        }
        
        return initialMap;
    }
}
